﻿/*****************************************************************//**
 * @file    FITKAbsAlgorithmTools.h
 * @brief   抽象算法工具。
 *
 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-12-20
 *********************************************************************/

#ifndef __FITKABSALGORITHMTOOLS_H__
#define __FITKABSALGORITHMTOOLS_H__ 

#include "FITK_Kernel/FITKCore/FITKAbstractObject.hpp"

#include "FITKInterfaceModelAPI.h"

namespace Interface
{
    /**
     * @brief   变换结构体。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-12-20
     */
    struct FITKInerfaceModelAPI ToolTransform
    {
        double Angle = 0.;
        double Pt[3]{ 0., 0., 0. };
        double Dir[3]{ 0., 0., 1. };
        double Translate[3]{ 0., 0., 0. };
    };

    /**
     * @brief   变换计算工具类。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-12-20
     */
    class FITKInerfaceModelAPI FITKAbstractTransformTool : public Core::FITKAbstractObject
    {
    public:
        /**
         * @brief   构造函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-20
         */
        explicit FITKAbstractTransformTool() = default;

        /**
         * @brief   析构函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-20
         */
        virtual ~FITKAbstractTransformTool() = default;

        /**
         * @brief   创建变换计算工具类。[静态]
         * @return  变换计算工具
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-20
         */
        static FITKAbstractTransformTool* createTool();

        /**
         * @brief   执行一次平移。[虚函数]
         * @param   iX：X方向平移量
         * @param   iY：Y方向平移量
         * @param   iZ：Z方向平移量
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual void transform(double iX, double iY, double iZ)
        {
            Q_UNUSED(iX);
            Q_UNUSED(iY);
            Q_UNUSED(iZ);
        }

        /**
         * @brief   执行一次旋转。[虚函数]
         * @param   iPt1：旋转轴坐标1
         * @param   iPt2：旋转轴坐标2
         * @param   iAngle：旋转角（角度）
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual void rotate(double* iPt1, double* iPt2, double iAngle)
        {
            Q_UNUSED(iPt1);
            Q_UNUSED(iPt2);
            Q_UNUSED(iAngle);
        }

        /**
         * @brief   获取当前变换旋转信息。[虚函数]
         * @param   oPt1：旋转轴坐标1
         * @param   oPt2：旋转轴坐标2
         * @param   oAngle：旋转角（角度）[引用]
         * @return  当前变换是否为有效旋转
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual bool isRotation(double* oPt1, double* oPt2, double & oAngle)
        {
            Q_UNUSED(oPt1);
            Q_UNUSED(oPt2);
            Q_UNUSED(oAngle);
            return false;
        }

        /**
         * @brief   坐标变换。
         * @param   iPt：原始坐标
         * @param   oPt：输出坐标
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual void transformPoint(double* iPt, double* oPt)
        {
            Q_UNUSED(iPt);
            Q_UNUSED(oPt);
        }

        /**
         * @brief   方向变换。
         * @param   iDir：原始方向
         * @param   oDir：输出方向
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual void transformDirection(double* iDir, double* oDir)
        {
            Q_UNUSED(iDir);
            Q_UNUSED(oDir);
        }

        /**
         * @brief   获取当前变换矩阵与向量。[虚函数]
         * @param   oMat：变换矩阵
         * @param   oVec：平移向量
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual void data(double oMat[3][3], double* oVec)
        {
            Q_UNUSED(oMat);
            Q_UNUSED(oVec);
        }

        /**
         * @brief   设置变换矩阵与向量。[虚函数]
         * @param   iMat：变换矩阵
         * @param   iVec：平移向量
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-23
         */
        virtual void setData(double iMat[3][3], double* iVec)
        {
            Q_UNUSED(iMat);
            Q_UNUSED(iVec);
        }

    };

    /**
     * @brief   抽象算法工具创建器。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-12-20
     */
    class FITKInerfaceModelAPI FITKAbsAlgorithmToolsCreator
    {
    public:
        /**
         * @brief   构造函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-20
         */
        explicit FITKAbsAlgorithmToolsCreator() = default;

        /**
         * @brief   析构函数。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-20
         */
        virtual ~FITKAbsAlgorithmToolsCreator() = default;

        /**
         * @brief   创建变换工具。[虚函数]
         * @return  变换工具
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-12-20
         */
        virtual Interface::FITKAbstractTransformTool* createTransformTool();

    };
}

#endif //!__FITKABSALGORITHMTOOLS_H__
